// 中卷 第四章 强制类型转换
// 类型转换发生在静态类型语言的编译阶段，强制类型转换发生在动态类型语言的运行时
var a = 42;
var b = a + ""; // 隐式强制
var c = String(a); // 显式强制

// toString 处理非字符串到字符串的强制类型转换
// 对于普通对象 toString() 返回内部属性[[class]]的值
var foo = {};
console.log(foo.toString()); // "[object Object]"
// 数组的toString() 被重新定义过，将所有单元字符串化后用'，'连接起来
var a = [1, 2, 3];
console.log(a.toString()); // "1,2,3"

// JSON字符串化  --- JSON.stringify(..) 的结果总时字符串
JSON.stringify("42"); // ""42""(含有双引号的字符串)
// 不安全的JSON值  --> undefined function symbol 包含循环引用的对象
// JOSN.stringify() 遇到 undefined  function symbol 会自动忽略，返回undefined 在数组中会返回null
// toJSON() 返回一个适当的值，可以进行字符串化
// JSON第二个参数 replacer 可选，可以是数组或函数
// 如果 replacer 是一个数组，那么它必须是一个字符串数组，其中包含序列化要处理的对象 的属性名称，除此之外其他的属性则被忽略。
// 如果 replacer 是一个函数，它会对对象本身调用一次，然后对对象中的每个属性各调用 一次，每次传递两个参数，键和值。如果要忽略某个键就返回 undefined，否则返回指定 的值。
var a = { b: 45, c: "42", d: [1, 2, 3] };
JSON.stringify(a, ["b", "c"]);
JSON.stringify(a, function (k, v) {
  if (k !== "c") return v;
}); // "{"b": 45, "d":[1,2,3]}"
// JSON.stringify 第三个可选参数 space 指定输出的缩进格式
// 正整数时 指定每一级缩进的字符数   字符串时 最前面的十个字符被用于每一级的缩进
var a = { b: 45, c: "42", d: [1, 2, 3] };
console.log(JSON.stringify(a, null, 4));
console.log(JSON.stringify(a, null, "-------======="));

// ToNumber  之后会有详细介绍
// true -> 1 false -> 0 undefined -> NaN null -> 0
// 对象，数组会首先被转换为相应的基本类型值，若返回非数字的基本类型，下面
var a = "abc";
var b = {}
console.log(Number(a), Number(b));
console.log(Number(["abc"]));

// ToBoolean
// 假值  -> undefined null false +0 -0 NaN ""
// 假值对象